home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga CD-Sensation: Demos Are Forever
/
Amiga CD-Sensation - Ausgabe 1 - Demos Are Forever (1996)(GTI - Schatztruhe)(DE)[!].iso
/
Big Bunch
/
The Rest
/
Mapping Demo
/
RRT.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-28
|
12KB
|
399 lines
;/* Realtime Ray Tracer
lc -b1 -ccit -v -D RRT.c
quit
*/
#include "rrt.h"
/*** MED MUSIC ***/
extern struct MMD0 far MEDSONG;
/***** Declarations for CBACK *****/
long _BackGroundIO = 0;
char *_procname = 0;
long _stack = 10000;
long _priority = 50;
int CXBRK(void) { return(0); } /* Disable Lattice CTRL-C handling */
int chkabort(void) { return(0); } /* really */
/***** Libraries and HardWare *****/
struct IntuitionBase *IntuitionBase=NULL;
struct GfxBase *GfxBase=NULL;
extern struct Custom __far custom;
/***** Graphics Data *****/
extern unsigned char far BM0[32000];
extern unsigned char far BM1[32000];
char FastRead[8000];
ULONG output;
extern unsigned char far SILVERFOX[1];
UWORD ImageDataBall[] = {
0x003F,0xF800,0x00F0,0xFE00,0x03C0,0x3380,0x06CF,0x33C0,
0x0F00,0xC8E0,0x1B00,0xCCF0,0x3D3C,0xEC78,0x3F3C,0xEC38,
0x6B3C,0xE63C,0x433C,0xE63C,0x9300,0xE63E,0xB900,0xCC3E,
0x9CFF,0x8C3E,0x9E7F,0x1C3E,0x8F3C,0x3C1E,0x8F80,0x3C0E,
0x8FC0,0x3E06,0x87E0,0x3F02,0xC1F8,0x1F82,0xC0FC,0x0FC2,
0xE07C,0x07C2,0x703C,0x03C0,0x7838,0xF1CC,0x3C31,0xF8C8,
0x3C33,0x0CF8,0x1E33,0x0CF0,0x0E33,0x0F20,0x0733,0x0B00,
0x038D,0xFC80,0x00E6,0x6800,0x003E,0x0800,
0x003F,0xF800,0x00FF,0xFE00,0x0380,0x0F80,0x070F,0x0FC0,
0x0C7F,0xC7E0,0x1CFF,0xC3F0,0x31C3,0xE3F8,0x33C3,0xE3F8,
0x73C3,0xE1FC,0x73C3,0xE1FC,0xE3FF,0xE1FE,0xC1FF,0xC3FE,
0xE0FF,0x83FE,0xE07F,0x03FE,0xF03C,0x03FE,0xF000,0x03FE,
0xF000,0x01FE,0xF800,0x00FE,0xFE00,0x007E,0xFF00,0x003E,
0xFF80,0x003E,0x7FC0,0x003C,0x7FC0,0xF03C,0x3FC1,0xF838,
0x3FC3,0xFC38,0x1FC3,0xFC30,0x0FC3,0xFCE0,0x07C3,0xF8C0,
0x03F1,0xF380,0x00F8,0x6600,0x003F,0xF800,
0x003F,0xF800,0x00FF,0xFE00,0x03FF,0xFF80,0x07F0,0xFFC0,
0x0F80,0x3FE0,0x1F00,0x3FF0,0x3E00,0x1FF8,0x3C00,0x1FF8,
0x7C00,0x1FFC,0x7C00,0x1FFC,0xFC00,0x1FFE,0xFE00,0x3FFE,
0xFF00,0x7FFE,0xFF80,0xFFFE,0xFFC3,0xFFFE,0xFFFF,0xFFFE,
0xFFFF,0xFFFE,0xFFFF,0xFFFE,0xFFFF,0xFFFE,0xFFFF,0xFFFE,
0xFFFF,0xFFFE,0x7FFF,0xFFFC,0x7FFF,0x0FFC,0x3FFE,0x07F8,
0x3FFC,0x03F8,0x1FFC,0x03F0,0x0FFC,0x03E0,0x07FC,0x07C0,
0x03FE,0x0F80,0x00FF,0x9E00,0x003F,0xF800
};
/****
struct BitMap
{ UWORD BytesPerRow, Rows;
UBYTE Flags, Depth;
UWORD pad;
PLANEPTR Planes[8]; }
****/
struct BitMap BMap[] =
{{ 40, 200, 0, 4, 0, &BM0[0], &BM0[8000], &BM0[16000], &BM0[24000], NULL, NULL, NULL, NULL },
{ 40, 200, 0, 4, 0, &BM1[0], &BM1[8000], &BM1[16000], &BM1[24000], NULL, NULL, NULL, NULL },
{ 40, 200, 0, 4, 0, &BM1[0], &BM1[0], &BM1[0], &BM1[0], NULL, NULL, NULL, NULL },
{ 40, 200, 0, 1, 0, &BM0[24000], NULL, NULL, NULL, NULL, NULL, NULL, NULL },
{ 40, 200, 0, 1, 0, &BM0[16000], NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};
struct RasInfo *DB_rinfo = NULL;
struct ViewPort *vport = NULL;
struct NewScreen NewScreenStructure = {
0,0, /* screen XY origin relative to View */
320,200, /* screen width and height */
4, /* screen depth (number of bitplanes) */
0,1, /* detail and block pens */
SPRITES, /* display modes for this screen */
CUSTOMSCREEN|CUSTOMBITMAP, /* screen type */
NULL, /* pointer to default screen font */
NULL, /* screen title */
NULL, /* first in list of custom screen gadgets */
&BMap[0] /* pointer to custom BitMap structure */
};
struct Screen *MyScreen=NULL;
struct NewWindow NewWindowStructure1 = {
0,0, /* window XY origin relative to TopLeft of screen */
320,200, /* window width and height */
0,1, /* detail and block pens */
VANILLAKEY, /* IDCMP flags */
/* other window flags */
SIMPLE_REFRESH|BORDERLESS|RMBTRAP|NOCAREREFRESH|BACKDROP|ACTIVATE,
NULL, /* first gadget in gadget list */
NULL, /* custom CHECKMARK imagery */
NULL, /* window title */
NULL, /* custom screen pointer */
NULL, /* custom bitmap */
1,1, /* minimum width and height */
-1,-1, /* maximum width and height */
CUSTOMSCREEN /* destination screen type */
};
struct Window *MyWindow=NULL;
struct UCopList usercopper;
UWORD ColorPalettes[][32] =
{
{ 0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 },
{ 0x000,0xFFF,0xFEF,0xEDF,0xDCF,0xDBF,0xCAF,0xC9F, /* SilverFox Colors */
0xB8F,0xB6F,0xA5F,0xA4F,0x93F,0x92F,0x81F,0x80F,
0x0F0,0xF00,0xD00,0xB00,0x900,0x800,0x600,0x400, /* Reflect Colors */
0x0F0,0xAAF,0x99D,0x88B,0x779,0x668,0x556,0x444 },
{ 0x000,0x558,0x88B,0xFFF,0x000,0x558,0x88B,0xFFF, /* Plane and stars */
0x49F,0x49F,0x49F,0x49F,0x00F,0x00F,0x00F,0x00F }
};
short Xarray[32][32];
short Yarray[32][32];
ULONG Yoffsets[200];
extern ULONG far NOMOUSE[];
extern UWORD chip Sprite2_data[31*2+4];
extern UWORD chip Sprite3_data[31*2+4];
extern UWORD chip Sprite3a_data[31*2+4];
extern UWORD chip Sprite4_data[31*2+4];
extern UWORD chip Sprite5_data[31*2+4];
extern UWORD chip Sprite5a_data[31*2+4];
struct SimpleSprite Sprite2;
struct SimpleSprite Sprite3;
struct SimpleSprite Sprite4;
struct SimpleSprite Sprite5;
short spg2=0,spg3=0,spg4=0,spg5=0;
/* * * * * * * * * * * EXTERNAL ROUTINES * * * * * * * * * */
VOID __regargs UnPackByteRun(UBYTE *from, UBYTE *to);
VOID __regargs ComputeInterColor(UWORD *from, UWORD *to, UWORD step);
VOID __regargs WaitFRAMES(UWORD frames);
VOID __regargs SLAM_BLITTER(BLIT_PARMS *a0);
VOID DoDemo();
VOID __regargs StarOffsets(ULONG mod_d0);
VOID ComputeStarField();
VOID DisplayStarField();
extern PLANEPTR far Plane1ptr;
extern PLANEPTR far Plane2ptr;
/*************** Beginning of code ***************/
VOID CleanUp()
{
if (DB_rinfo!=NULL)
{ vport->UCopIns = NULL; RemakeDisplay(); }
if (MyWindow!=NULL)
CloseWindow(MyWindow);
if (spg5==5) FreeSprite(5);
if (spg4==4) FreeSprite(4);
if (spg3==3) FreeSprite(3);
if (spg2==2) FreeSprite(2);
if (MyScreen!=NULL)
{ FreeCopList(usercopper.CopList);
CloseScreen(MyScreen); }
if (IntuitionBase!=NULL)
CloseLibrary((struct Library *)IntuitionBase);
if (GfxBase!=NULL)
CloseLibrary((struct Library *)GfxBase);
exit(0);
}
VOID __regargs GridZAP(short from,short to,short amount)
{
BLIT_PARMS myblit;
myblit.dmod=0;
myblit.con1=0;
myblit.bmod=-40;
myblit.con0=(ABC|ABNC|NABC|NABNC)|(DEST|SRCB);
myblit.addb=8000;
myblit.addcd=8000;
myblit.planes=4;
myblit.bpt=(USHORT *)(&BM1[from*40]);
myblit.dpt=(USHORT *)(&BM0[to*40]);
myblit.size=BLTSIZE(20,amount);
SLAM_BLITTER(&myblit);
}
VOID __regargs mybbm(struct Bitmap *f,long fy,struct Bitmap *t,long ty,long h,long m,long p)
{ BltBitMap(f,0,fy,t,0,ty,320,h,m,p,0); }
VOID InitStuff()
{
register USHORT loop;
struct RastPort *RPort;
/**** Open Libraries ****/
if (
((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0))==NULL) ||
((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
)
{ CleanUp(); }
/***** SCREEN OPEN *****/
if ((MyScreen=(struct Screen *) OpenScreen(&NewScreenStructure))==NULL)
CleanUp();
vport = &(MyScreen->ViewPort);
vport->SpritePriorities=0;
LoadRGB4(vport,ColorPalettes[0],32);
/***** Set Up CopperList *****/
CINIT(&usercopper,200)
CWait(&usercopper,37,0); CBump(&usercopper);
for(loop=1;loop!=16;loop++)
{
CMove(&usercopper,(long)&custom.color[loop],ColorPalettes[2][loop]);
CBump(&usercopper);
}
CWait(&usercopper,161,0); CBump(&usercopper);
for(loop=1;loop!=16;loop++)
{
CMove(&usercopper,(long)&custom.color[loop],ColorPalettes[1][loop]);
CBump(&usercopper);
}
CEND(&usercopper)
/**** Get Sprites ****/
if (
((spg2=GetSprite(&Sprite2,2))==-1) ||
((spg3=GetSprite(&Sprite3,3))==-1) ||
((spg4=GetSprite(&Sprite4,4))==-1) ||
((spg5=GetSprite(&Sprite5,5))==-1)
)
{ CleanUp(); }
Sprite2.height=Sprite3.height=Sprite4.height=Sprite5.height=31;
ChangeSprite(vport,&Sprite2,Sprite2_data);
ChangeSprite(vport,&Sprite3,Sprite3_data);
ChangeSprite(vport,&Sprite4,Sprite4_data);
ChangeSprite(vport,&Sprite5,Sprite5_data);
Sprite3_data[1]|=SPRITE_ATTACHED;
Sprite5_data[1]|=SPRITE_ATTACHED;
Sprite3a_data[1]|=SPRITE_ATTACHED;
Sprite5a_data[1]|=SPRITE_ATTACHED;
/***** WINDOW OPEN *****/
NewWindowStructure1.Screen = MyScreen;
if ((MyWindow=(struct Window *) OpenWindow(&NewWindowStructure1))==NULL)
CleanUp();
ShowTitle(MyScreen,FALSE);
SetPointer(MyWindow,(short*)&NOMOUSE[0],1,16,0,0);
WaitFRAMES(1);
RemakeDisplay();
/*** Set Up the intuition data for using BM1 as double buffer to BM0 ***/
DB_rinfo = vport->RasInfo;
/*** Show the SilverFox Logo -- BEGIN DEMO ***/
RelocModule(&MEDSONG);
InitPlayer();
PlayModule(&MEDSONG);
UnPackByteRun(SILVERFOX,BM0);
for(loop=1; loop<=16; loop++)
{ WaitFRAMES(3); ComputeInterColor(ColorPalettes[0],ColorPalettes[1],loop); }
mybbm(&BMap[0],0,&BMap[1],0,200,192,15);
for(loop=1; loop!=107; loop++)
{ WaitFRAMES(1); GridZAP(loop,1,loop); }
for(loop=1; loop!=36; loop++)
{ WaitFRAMES(2);
GridZAP(loop+107,loop,107);
GridZAP(177-loop,177-loop,20); }
vport->UCopIns = &usercopper; RemakeDisplay();
RPort=MyWindow->RPort;
SetAPen(RPort,12);
for(loop=0;loop!=10;loop++)
{
Move(RPort,53+loop,50);
Draw(RPort,53+loop,150);
Move(RPort,155+loop,50);
Draw(RPort,155+loop,150);
Move(RPort,257+loop,50);
Draw(RPort,257+loop,150);
Move(RPort,0,95+loop);
Draw(RPort,319,95+loop);
}
mybbm(&BMap[1],0,&BMap[2],0,200,0xE0,14);
mybbm(&BMap[2],0,&BMap[0],40,107,0x60,8);
mybbm(&BMap[3],40,&BMap[4],40,107,0x80,1);
memset(BM1,0,8000);
mybbm(&BMap[0],0,&BMap[2],0,200,0xE0,15);
OwnBlitter(); WaitBlit(); DisownBlitter();
memcpy(FastRead,BM1,8000);
mybbm(&BMap[0],0,&BMap[1],0,200,0xC0,15);
MoveSprite(vport,&Sprite2,100,45);
MoveSprite(vport,&Sprite4,116,45);
for(loop=0;loop!=62;loop+=2)
{
Sprite2_data[2+loop]=ImageDataBall[0+loop];
Sprite2_data[3+loop]=ImageDataBall[31*2+loop];
Sprite3_data[2+loop]=Sprite3a_data[2+loop]=ImageDataBall[31*4+loop];
//Sprite3_data[3+loop]=0;
Sprite4_data[2+loop]=ImageDataBall[1+loop];
Sprite4_data[3+loop]=ImageDataBall[(1+31*2)+loop];
Sprite5_data[2+loop]=Sprite5a_data[2+loop]=ImageDataBall[(1+31*4)+loop];
//Sprite5_data[3+loop]=0;
}
StarOffsets(40);
Plane1ptr=&BM0[46*40+0];
Plane2ptr=&BM0[46*40+8000];
}
VOID CalculateMap()
{
short y1,x,x1;
long y,x2;
double r;
for(y=0; y<32; y++)
{
y1=y-15;
for(x=0; x<32; x++)
{
x1=x-15;
x2=(256-(y1*y1)-(x1*x1));
if (x2>0)
{
r=32.0/sqrt((double)x2);
r*=((double)x1);
r+=15.5;
x2=(short)r;
Xarray[y][x]=x2;
Yarray[x][y]=x2;
}
else
{
Xarray[y][x]=9999;
Yarray[x][y]=9999;
}
}
}
x2=(ULONG)FastRead;;
for(y=0;y!=200;y++)
{
Yoffsets[y]=x2;
x2+=40;
}
}
VOID Finish()
{
short loop;
struct RastPort *rport;
rport=MyWindow->RPort;
SetAPen(rport,0);
for(loop=0;loop!=65;loop++)
{
Move(rport,loop,36+loop);
Draw(rport,319-loop,36+loop);
Draw(rport,319-loop,163-loop);
Draw(rport,loop,163-loop);
Draw(rport,loop,36+loop);
}
vport->UCopIns = NULL; RemakeDisplay();
for(loop=1; loop<=16; loop++)
{ WaitFRAMES(3); ComputeInterColor(ColorPalettes[1],ColorPalettes[0],loop); }
RemPlayer();
}
main()
{
CalculateMap();
InitStuff();
DoDemo();
Finish();
CleanUp();
}